package com.sos.model.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 帮助者信息表实体（与User一对一）
 */
@Data
@Entity
@Table(name = "helper_info",
        uniqueConstraints = @UniqueConstraint(columnNames = "user_id") // 唯一键：user_id不重复
)
@DynamicInsert
@DynamicUpdate
public class HelperInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * ID（自增主键）
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 用户ID（关联user表，非空且唯一）
     */
    @Column(name = "user_id", nullable = false)
    private Long userId;

    /**
     * 技能特长（如:急救,维修等，用逗号分隔）
     */
    @Column(length = 500)
    private String skills;

    /**
     * 服务半径（米，默认5000）
     */
    @Column(name = "service_radius", columnDefinition = "int default 5000")
    private Integer serviceRadius = 5000;

    /**
     * 在线状态（0:离线 1:在线）
     */
    @Column(name = "online_status")
    private Integer onlineStatus = 0;

    /**
     * 最后一次上报的纬度
     */
    @Column(name = "last_latitude", precision = 10, scale = 6)
    private BigDecimal lastLatitude;

    /**
     * 最后一次上报的经度
     */
    @Column(name = "last_longitude", precision = 10, scale = 6)
    private BigDecimal lastLongitude;

    /**
     * 最后活跃时间
     */
    @Column(name = "last_active_time")
    private LocalDateTime lastActiveTime;

    /**
     * 评分（满分5分）
     */
    @Column(precision = 3, scale = 2)
    private BigDecimal rating;

    /**
     * 帮助次数
     */
    @Column(name = "help_count")
    private Integer helpCount = 0;

    /**
     * 创建时间（数据库默认CURRENT_TIMESTAMP）
     */
    @Column(name = "created_time", updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间（数据库默认CURRENT_TIMESTAMP ON UPDATE）
     */
    @Column(name = "updated_time")
    private LocalDateTime updatedTime;

    /**
     * 关联用户（一对一）
     */
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", insertable = false, updatable = false)
    @JsonIgnore
    private User user;

    /**
     * 自动填充创建和更新时间
     */
    @PrePersist
    public void prePersist() {
        this.createdTime = LocalDateTime.now();
        this.updatedTime = LocalDateTime.now();
    }

    @PreUpdate
    public void preUpdate() {
        this.updatedTime = LocalDateTime.now();
    }
}